package site.hanzhe.did.utils;

import cn.hutool.core.date.DatePattern;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.lang.Console;
import cn.hutool.core.util.ObjUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import site.hanzhe.did.constant.DidConst;
import site.hanzhe.did.props.ConfigProp;
import site.hanzhe.did.props.DockerProp;

import java.io.File;
import java.net.Proxy;
import java.nio.charset.StandardCharsets;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;

/**
 * 项目初始化工具类
 *
 * @author 张涵哲
 * @since 2024-06-12 21:01:33
 */
public class ConfigUtil {

    public static final File CONFIG_FILE = new File("config.json");
    public static ConfigProp config;

    /**
     * 项目初始化
     *
     * @author 张涵哲
     * @since 2024-06-12 21:06:21
     */
    public static void initialize() {
        // 初始化配置文件
        initConfigFile();
        // 初始化代理设置
        initProxy();
    }

    /**
     * 初始化配置文件
     *
     * @author 张涵哲
     * @since 2024-06-14 12:35:50
     */
    private static void initConfigFile() {
        if (CONFIG_FILE.exists()) {
            String json = FileUtil.readString(CONFIG_FILE, StandardCharsets.UTF_8);
            config = JSONUtil.toBean(json, ConfigProp.class);
        } else {
            config = ConfigProp.newDefaultInstance();
            String jsonPrettyStr = JSONUtil.toJsonPrettyStr(config);
            FileUtil.writeString(jsonPrettyStr, CONFIG_FILE, StandardCharsets.UTF_8);
            Console.log("未检测到配置文件，已在当前目录自动创建config.json");
        }
    }

    /**
     * 初始化代理设置
     *
     * @author 张涵哲
     * @since 2024-06-14 12:49:26
     */
    private static void initProxy() {
        if (config.isEnableProxy()) {
            String proxyType = config.getProxy().toUpperCase(Locale.ROOT);
            String proxyUrl = config.getProxyUrl();
            Console.log("当前使用{}代理，代理地址为{}", proxyType, proxyUrl);
        } else {
            Console.log("当前未使用代理，将直接使用本地网络进行下载");
        }
    }

    /**
     * 初始化Docker
     *
     * @author 张涵哲
     * @since 2024-06-14 13:08:58
     */
    public static void initDocker(String input) {
        input = StrUtil.removePrefix(input, "docker pull ");
        // 初始化DockerProp属性信息
        initDockerProp(input);
        // 初始化Docker文件目录
        initWorkspace();
    }

    /**
     * 初始化DockerProp属性信息
     *
     * @author 张涵哲
     * @since 2024-06-14 13:00:27
     * @param input 命令行输入的需要下载的镜像信息
     */
    private static void initDockerProp(String input) {
        String[] split = input.split("/");
        String imgTag = null;
        if (split.length == 1) {     // 例如 openjdk:8
            DockerProp.repository = "library";
            imgTag = split[0];
        }
        if (split.length == 2) {     // 例如 minio/minio:latest 或者 xxx.xx/xxx:xx
            String first = split[0];
            if (first.contains(".")) {
                DockerProp.registry = split[0];
                DockerProp.repository = "library";
                imgTag = split[1];
            } else {
                DockerProp.repository = split[0];
                imgTag = split[1];
            }
        }
        if (split.length == 3) {     // registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g:latest
            DockerProp.registry = split[0];
            DockerProp.repository = split[1];
            imgTag = split[2];
        }
        // 镜像名称和版本号
        String[] imgTagSplit = imgTag.split(":");
        DockerProp.img = imgTagSplit[0];
        DockerProp.tag = "latest";
        if (imgTagSplit.length == 2) {
            DockerProp.tag = imgTagSplit[1];
        }
    }

    /**
     * 初始化Docker工作空间目录
     *
     * @author 张涵哲
     * @since 2024-06-14 13:19:53
     */
    private static void initWorkspace() {
        // 初始化镜像保存目录
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(DatePattern.PURE_DATETIME_PATTERN);
        String now = LocalDateTime.now().format(formatter);
        String directoryName = DockerProp.getImgTag();
        DockerProp.workspace = new File(DidConst.TEMP_DIR + "/" + directoryName + DidConst.SEPARATE + now);
        File parentDir = DockerProp.workspace.getParentFile();
        // 相似目录检测
        for (File file : ObjUtil.defaultIfNull(parentDir.listFiles(), new File[0])) {
            if (file.getName().startsWith(directoryName + "_")) {
                InputUtil.exit("在 " + parentDir.getAbsolutePath() + " 检测到相似目录，镜像可能已存在，继续下载可能会覆盖已下载的镜像，是否继续(y/n)：");
                break;
            }
        }
        // 创建工作空间目录，用来保存下载镜像过程中产生的文件
        DockerProp.workspace.mkdirs();
        // 创建VERSION文件
        FileUtil.writeString(DidConst.DOCKER_VERSION, new File(DockerProp.workspace, "VERSION"), StandardCharsets.UTF_8);
        Console.log("目录初始化完成：{}", DockerProp.workspace.getAbsolutePath());
    }

    /**
     * 获取代理对象
     *
     * @author 张涵哲
     * @since 2024-06-14 13:31:40
     */
    public static Proxy getProxy() {
        if (config.isEnableProxy()) {
            return new Proxy(config.getProxyType(), config.getProxyInet());
        }
        return null;
    }

}
